/**
 * 1041. 困于环中的机器人
 * https://leetcode-cn.com/problems/robot-bounded-in-circle/
 */
public class Solutions_1041 {
    public static void main(String[] args) {
//        String str = "GGLLGG";  // output: true
//        String str = "GG";  // output: false
//        String str = "GL";  // output: true
        String str = "LLGLL";  // output: false  每走一次，向南移动一个单位

        boolean result = isRobotBounded(str);
        System.out.println(result);
    }

    /**
     * 走一圈后，回到原点，说明有环
     * 走一圈后，走向发生变化（不再指向北方），说明有环
     *      （因为可以重复走 instructions，所以在一定的重复下，一定会再次回到原点）
     * 其他情况的，不会存在环，会无限向一个方向移动，
     */
    public static boolean isRobotBounded(String instructions) {
        int x = 0, y = 0, dir = 0;

        char[] arr = instructions.toCharArray();
        // 先走上一圈，看看走到的位置及最终的走向
        for (char c : arr) {
            if (c == 'G') {
                // 根据方向，移动一个单位
                if (dir == 0) {
                    y += 1;
                } else if (dir == 1) {
                    x += 1;
                } else if (dir == 2) {
                    y -= 1;
                } else if (dir == 3) {
                    x -= 1;
                }
            } else {
                // 0、 1、 2、 3
                // 北、东、南、西
                if (c == 'L') {
                    dir = (dir - 1 + 4) % 4;
                } else {
                    dir = (dir + 1) % 4;
                }
            }
        }
        // 走一圈后，回到原点，说明有环
        if (x == 0 && y == 0) {
            return true;
        }
        // 走一圈后，走向发生变化（不再指向北方），说明有环
        if (dir != 0) {
            return true;
        }
        // 其他情况的，不会存在环，会无限向北移动
        return false;
    }
}
